package co.gov.medellin.ssti.sub.paoyer.common.util;

import java.util.Properties;
import java.io.FileInputStream;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.paoyer.common.exception.CommonSystemException;
import co.gov.medellin.ssti.sub.paoyer.common.exception.SystemException;

//TODO: purge?
public class PropertiesLoader {

	// Campo que almacena la �nica instancia disponible para esta clase.
	private static PropertiesLoader singletonInstance = null;

	Properties properties = new Properties();
	private static final String DEFAULT_PROPERTIES_FILE = "application.properties";

	/**
	 * Alimenta la clase con la informaci�n de los valores de las llaves
	 * almacenadas en un archivo de propiedades.
	 * 
	 */
	private PropertiesLoader() {

		this.refresh("");
	}

	/**
	 * Devuelve la instancia disponible de esta clase.
	 * 
	 * @return SAAWPropertiesLoader Instancia de la clase.
	 */
	public static PropertiesLoader getInstance() {
		if (singletonInstance == null) {
			singletonInstance = new PropertiesLoader();
		}
		return singletonInstance;
	}

	/**
	 * Devuelve el valor de una variable almacenada en el archivo de
	 * propiedades.
	 * 
	 * @param String
	 *            El nombre de la variable a consultar.
	 * 
	 * @return String El valor asociado a la variable solicitada por
	 *         par�metro.
	 * 
	 */
	public String getProperty(String propertyName) throws SystemException {

		String propertyValue;

		if (propertyName == null) {
			throw new SystemException(
					new CommonSystemException().getModuleVO(),
					CommonSystemException.PROPERTY_IS_NULL);
		}

		propertyValue = this.properties.getProperty(propertyName);
		if (propertyValue == null) {

			throw new SystemException(
					new CommonSystemException().getModuleVO(),
					CommonSystemException.PROPERTY_NOT_FOUND, null, null, false);
		}

		return propertyValue;
	}

	/**
	 * Carga una nueva lista de propiedades para esta clase, basado en el
	 * archivo pasado por par�metro.
	 * 
	 * @param fileName
	 */
	public void refresh(String fileName) throws SystemException {
		try {
			properties.clear();
			if ((fileName != null) && (!fileName.equals(""))) {
				String file = fileName + "/conf/application.properties";
				properties.load(new FileInputStream(fileName));
			} else {
				// Carga el archivo de propiedades por defecto.
				String path = System.getProperty("user.dir")
						+ DEFAULT_PROPERTIES_FILE;
				properties.load(new FileInputStream(DEFAULT_PROPERTIES_FILE));
			}

		} catch (Exception e) {
			SUBException.logDebugError(
					"Error leyendo archivo de propiedades SAAW. ", e);
			throw new SystemException(
					new CommonSystemException().getModuleVO(),
					CommonSystemException.ERROR_READING_PROPERTIES_FILE, e,
					null, false);
		}
	}

	/**
	 * Carga el archivo de propiedades por defecto.
	 */
	public void refresh() throws SystemException {
		this.refresh("");
	}

}